﻿using System;
using System.Threading.Tasks;

namespace Vk.Methods.Utils
{
    /// <summary>
    ///     Утилиты VkAPI
    /// </summary>
    public class Utils
    {
        private readonly Api _api;

        public Utils(Api api)
        {
            _api = api;
        }

        /// <summary>
        ///     Возвращает информацию о том, является ли внешняя ссылка заблокированной на сайте ВКонтакте
        /// </summary>
        /// <param name="url">Внешняя ссылка, которую необходимо проверить</param>
        /// <returns>
        ///     Возвращает одно из трёх значений поля status:
        ///     not_banned – ссылка не заблокирована
        ///     banned – ссылка заблокирована
        ///     processing – ссылка проверяется; необходимо выполнить повторный запрос через несколько секунд.
        /// </returns>
        public async Task<string> CheckLink(string url)
        {
            var query = new ApiQuery("utils.checkLink", true)
                .Add("url", url);

            var result = await _api.Manager.Execute(query);

            return _api.Manager.MethodSuccessed ? result.String("status") : null;
        }

        /// <summary>
        ///     Возвращает текущее время на сервере ВКонтакте
        /// </summary>
        public async Task<DateTime> GetServerTime()
        {
            var query = new ApiQuery("utils.getServerTime", true);

            var result = await _api.Manager.Execute(query);

            return result.DateTime().Value;
        }

        /// <summary>
        ///     Определяет тип объекта (пользователь, сообщество, приложение) и его идентификатор по короткому имени screen_name
        /// </summary>
        /// <param name="screenName">Короткое имя пользователя, группы или приложения. Например, apiclub, andrew или rules_of_war</param>
        public async Task<ObjectIdType> ResolveScreenName(string screenName)
        {
            var query = new ApiQuery("utils.resolveScreenName", true)
                .Add("screen_name", screenName);

            var result = await _api.Manager.Execute(query);

            return _api.Manager.MethodSuccessed ? new ObjectIdType(result) : null;
        }
    }

    /// <summary>
    ///     Результат метода Utils.ResolveScreenName
    /// </summary>
    public class ObjectIdType
    {
        /// <summary>
        ///     Идентификатор объекта
        /// </summary>
        public int? ObjectId { get; set; }

        /// <summary>
        ///     Тип объекта (user, group, application)
        /// </summary>
        public string Type { get; set; }

        public ObjectIdType(ApiNode node)
        {
            Type = node.String("type");
            ObjectId = node.Int("object_id");
        }
    }
}